//
//  DispathQueueCreateDemo.h
//  GCDDemo
//
//  Created by kingboyrang on 2021/10/29.
//  Copyright © 2021 wulanzhou. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/**
========================================================================================================
 队列创建
========================================================================================================
 
 可以使用 dispatch_queue_create 方法来创建队列。该方法需要传入两个参数：
 第一个参数表示队列的唯一标识符，用于 DEBUG，可为空。队列的名称推荐使用应用程序 ID 这种逆序全程域名。
 第二个参数用来识别是串行队列还是并发队列。DISPATCH_QUEUE_SERIAL 表示串行队列，DISPATCH_QUEUE_CONCURRENT 表示并发队列。
 
 1.主队列是串行队列 dispatch_queue_t queue = dispatch_get_main_queue();
 2.全局队列是并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
========================================================================================================
 主线程』中，『不同队列』+『不同任务』简单组合的区别：
========================================================================================================
 区别                    并发队列                 串行队列                      主队列
 同步（sync）    没有开启新线程，串行执行任务    没有开启新线程，串行执行任务          死锁卡住不执行
 异步（async）    有开启新线程，并发执行任务    有开启新线程（1条），串行执行任务     没有开启新线程，串行执行任务

 
 ========================================================================================================
  串行队列+并发队列与同步、异步的组合
 ========================================================================================================
 1.同步执行 + 并发队列
 2.异步执行 + 并发队列
 3.同步执行 + 串行队列
 4.异步执行 + 串行队列
 
 */
@interface DispathQueueCreateDemo : NSObject

/**
 创建串行队列
 */
- (dispatch_queue_t)createSerialQueue;

/**
 创建并发队列
 */
- (dispatch_queue_t)createCONCURRENTQueue;

/**
1.同步执行 + 并发队列
 
 特点：在当前线程中执行任务，不会开启新线程，执行完一个任务，再执行下一个任务。
 */
- (void)syncCONCURRENTQueue;

/**
 2.异步执行 + 并发队列
  特点：可以开启多个线程，任务交替（同时）执行。
 */
-(void)asyncCONCURRENTQueue;

/**
 3.同步执行 + 串行队列
 特点：不会开启新线程，在当前线程执行任务。任务是串行的，执行完一个任务，再执行下一个任务。
 */
-(void)syncSerialQueue;

/**
 4.异步执行 + 串行队列 = (异步执行 + 主队列)
  特点：会开启新线程，但是因为任务是串行的，执行完一个任务，再执行下一个任务
 */
-(void)asyncSerialQueue;

/**
 5.同步执行 + 主队列(发生死锁)
 * 特点(主线程调用)：互等卡主不执行。
 * 特点(其他线程调用)：不会开启新线程，执行完一个任务，再执行下一个任务。
 */
-(void)syncMainQueue;

/**
 栅栏方法dispatch_barrier_async
 dispatch_barrier_async 方法会等待前边追加到并发队列中的任务全部执行完毕之后，再将指定的任务追加到该异步队列中.
 举例说明：A、B、C、D四个任务，A、B任务执行完成后，才能执行C、D任务，dispatch_barrier_async的作用，就是把A、B任务分隔开来等待完成，在执行后面的任务
 */
- (void)barrierAsyncQueue;




@end

NS_ASSUME_NONNULL_END
